postgresql数据库升级
pg_upgrade官网介绍:https://www.postgresql.org/docs/10/pgupgrade.html
1.查看老版本参数
数据库中查看
select name,setting,unit from pg_catalog.pg_settings where context='internal'
命令行查看
# postgres用户下执行命令
pg_config
重点关注一下四个参数,block_size,segment_size,wal_block_size,wal_segment_size
2.安装新版本PG
# 以下命令使用root用户执行
tar vxf postgresql-12beta1.tar.gz
cd postgresql-12beta1
./configure --prefix=/usr/local/pgsql-12.0 --with-wal-blocksize=8 --with-segsize=1 --with-blocksize=8
make -j 10
make install
export PATH=$PATH:/usr/local/pgsql-12.0/bin
cd contrib
make all
make install
注意,在编译的时候,一定要保证参数的值和旧版本数据库的值相同,否则后续无法升级
3.初始化新版本数据库
新版本数据库和旧版本数据库的PGDATA必须在同一个文件系统(目录)内才可以使用--link(硬链接)
# 以下命令使用postgres用户执行
cd /usr/local/pgsql-12.0/bin/
./initdb --wal-segsize=16 -D /pgdata01/data/
pg12中编译时没有wal_segment_size参数,可以在初始化时指定
4.升级前检查
cd /tmp
mkdir upgrade_log
cd upgrade_log
# 使用link硬链接方式的检查
/usr/local/pgsql-12.0/bin/pg_upgrade -c -- link -b /postgresql/pgsql/database/bin -B /usr/local/pgsql-12.0/bin -d /postgresql/pgsql/body/etc -D /pgdata01/data
# 使用copy方式的检查
/usr/local/pgsql-12.0/bin/pg_upgrade -c -b /postgresql/pgsql/database/bin -B /usr/local/pgsql-12.0/bin -d /postgresql/pgsql/body/etc -D /pgdata01/data
5.解决检查的失败项
本例检查失败,因为旧版本数据库安装了一个插件。可以卸载插件或者在新版本数据库上面安装插件。
# 因为postgres,db01,db02,db03,db04数据库都安装有插件,因此都卸载掉
psql
drop extension pg_proctab;
\c db01
drop extension pg_proctab;
\c db02
drop extension pg_proctab;
\c db03
drop extension pg_proctab;
# 卸载完后,新版本数据库安装插件
unzip pg_proctab-0.0.7.zip
cd pg_proctab-0.0.7
export PATH=$PATH:/usr/local/pgsql-12.0/bin/
make
make install
安装完毕后,再次检查,看是否通过
6.升级
升级前请关闭旧版本数据库
6.1.copy方式
# 使用postgres用户
/usr/local/pgsql-12.0/bin/pg_upgrade -b /postgresql/pgsql/database/bin -B /usr/local/pgsql-12.0/bin -d /postgresql/pgsql/body/etc -D /pgdata01/data
优点:
copy方式是在旧版本数据库表空间同目录下新建一个新版本数据库的目录并将数据文件复制过来,因此在数据库升级后,如果新旧版本数据库的端口号不一样的话,可以同时开启
缺点:
对于大数据量数据库需要的升级时间较长,且旧版本数据库数据文件所在目录剩余容量至少和现有使用量相同,占据空间
6.2.link方式
# 使用postgres用户
/usr/local/pgsql-12.0/bin/pg_upgrade --link -b /postgresql/pgsql/database/bin -B /usr/local/pgsql-12.0/bin -d /postgresql/pgsql/body/etc -D /pgdata01/data
优点:
link方式是在旧版本数据库表空间目录下新建一个目录,并在里面新建一个硬链接直接指向旧版本数据库的数据文件,升级迅速且不占用空间
缺点:
因为旧版本数据库和新版本数据库由于硬链接,因此使用的实际是同一个文件,因此无法同时开启新旧版本数据库
查看是否是硬链接可以进入新版本数据库数据文件所在目录执行ll命令
# postgres用户
cd /data/tbs/PG_10_201707211/16384
ll
# 从结果里面可以看到,每一个数据文件2个目录指向它,硬链接
-rw-------. 2 postgres postgres 32768 Jun 26 09:09 16391
-rw-------. 2 postgres postgres 0 Jun 26 09:01 16394
7.修改环境变量
su - postgres
vi .bash_profile
##################################
export PGHOME=/usr/local/pgsql
export PGDATA=/pgdata01/data
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/pgsql/lib
export PATH=$PATH:$PGHOME/bin
##################################
8.修改配置
postgresql.conf和pg_hba.conf